/**
 * 图片CORS处理工具
 * 自动将有CORS问题的网络图片转换为本地可用的blob URL
 */

// URL编码处理函数 - 正确处理包含中文的URL
function encodeUrlPath(url: string): string {
	try {
		// 解析URL
		const urlObj = new URL(url);
		// 重新编码路径部分，保持域名部分不变
		const encodedPath = urlObj.pathname.split('/').map(segment => 
			segment ? encodeURIComponent(decodeURIComponent(segment)) : segment
		).join('/');
		urlObj.pathname = encodedPath;
		const finalUrl = urlObj.toString();
		console.log('🔄 URL编码处理:', url, '->', finalUrl);
		return finalUrl;
	} catch (error) {
		console.log('❌ URL编码失败，使用原始URL:', error);
		return url;
	}
}

// CORS图片处理 - 将网络图片转换为本地可用的blob URL
export async function fetchImageAsBlob(url: string): Promise<string> {
	// 先处理URL编码
	const encodedUrl = encodeUrlPath(url);
	
	// 方法0: 对于 bspapp.com 等 CDN，直接尝试使用编码后的URL
	if (url.includes('bspapp.com')) {
		try {
			console.log('🔄 尝试直接获取 CDN 图片:', encodedUrl);
			const response = await fetch(encodedUrl, {
				mode: 'cors',
				cache: 'force-cache'
			});
			if (response.ok) {
				const blob = await response.blob();
				const blobUrl = URL.createObjectURL(blob);
				console.log('✅ CDN 直接获取成功，创建blob URL:', blobUrl);
				return blobUrl;
			}
		} catch (cdnError) {
			console.log('❌ CDN 直接获取失败:', cdnError);
		}
	}
	
	try {
		// 方法1: 尝试通过本地代理获取
		const proxyUrl = encodedUrl.replace('http://music.bfmzdx.cn', '/api/image');
		console.log('🔄 尝试通过代理获取图片:', proxyUrl);
		
		const response = await fetch(proxyUrl);
		if (response.ok) {
			const blob = await response.blob();
			const blobUrl = URL.createObjectURL(blob);
			console.log('✅ 代理获取成功，创建blob URL:', blobUrl);
			return blobUrl;
		}
		throw new Error('代理获取失败');
	} catch (proxyError) {
		console.log('❌ 代理方法失败，尝试其他方法:', proxyError);
		
		// 方法2: 使用公共CORS代理服务，使用编码后的URL
		const encodedUrl = encodeUrlPath(url);
		const corsProxies = [
			`https://api.allorigins.win/raw?url=${encodeURIComponent(encodedUrl)}`,
			`https://corsproxy.io/?${encodeURIComponent(encodedUrl)}`
		];
		
		for (const proxyUrl of corsProxies) {
			try {
				console.log('🔄 尝试公共代理:', proxyUrl);
				const response = await fetch(proxyUrl);
				if (response.ok) {
					const blob = await response.blob();
					const blobUrl = URL.createObjectURL(blob);
					console.log('✅ 公共代理成功，创建blob URL:', blobUrl);
					return blobUrl;
				}
			} catch (error) {
				console.log('❌ 公共代理失败:', error);
			}
		}
		
		// 方法3: 尝试通过Canvas转换（如果图片支持CORS），使用编码后的URL
		try {
			const encodedUrl = encodeUrlPath(url);
			return await convertImageToBlob(encodedUrl);
		} catch (canvasError) {
			console.log('❌ Canvas方法失败:', canvasError);
			throw new Error('所有图片获取方法都失败了');
		}
	}
}

// 通过Canvas转换图片绕过CORS
export async function convertImageToBlob(url: string): Promise<string> {
	return new Promise((resolve, reject) => {
		const img = new Image();
		img.crossOrigin = 'anonymous';
		
		img.onload = () => {
			try {
				// 创建canvas并绘制图片
				const canvas = document.createElement('canvas');
				const ctx = canvas.getContext('2d');
				
				if (!ctx) {
					reject(new Error('无法创建canvas context'));
					return;
				}
				
				canvas.width = img.width;
				canvas.height = img.height;
				ctx.drawImage(img, 0, 0);
				
				// 转换为blob
				canvas.toBlob((blob) => {
					if (blob) {
						const blobUrl = URL.createObjectURL(blob);
						console.log('✅ Canvas转换成功，创建blob URL:', blobUrl);
						resolve(blobUrl);
					} else {
						reject(new Error('Canvas转换失败'));
					}
				}, 'image/png');
			} catch (error) {
				reject(error);
			}
		};
		
		img.onerror = () => {
			reject(new Error('图片加载失败'));
		};
		
		img.src = url;
	});
}

// 智能图片URL处理 - 自动处理CORS问题
export async function processImageUrl(originalUrl: string): Promise<string> {
	if (!originalUrl || originalUrl.startsWith('blob:') || originalUrl.startsWith('data:')) {
		return originalUrl; // 已经是本地URL，直接返回
	}
	
	// 检查是否是需要处理CORS的外部URL
	if (originalUrl.startsWith('http://') || originalUrl.startsWith('https://')) {
		try {
			console.log('🔍 检测到外部图片URL，开始CORS处理:', originalUrl);
			return await fetchImageAsBlob(originalUrl);
		} catch (error) {
			console.error('❌ 图片CORS处理失败:', error);
			return originalUrl; // 失败时返回原始URL
		}
	}
	
	return originalUrl; // 本地路径直接返回
}

// 图片处理缓存
const imageCache = new Map<string, string>();

// 带缓存的图片处理
export async function processImageUrlWithCache(originalUrl: string): Promise<string> {
	if (imageCache.has(originalUrl)) {
		console.log('📦 使用缓存的图片URL:', imageCache.get(originalUrl));
		return imageCache.get(originalUrl)!;
	}
	
	const processedUrl = await processImageUrl(originalUrl);
	if (processedUrl !== originalUrl) {
		imageCache.set(originalUrl, processedUrl);
	}
	
	return processedUrl;
}

// 清理blob URL缓存
export function cleanupImageCache() {
	for (const [originalUrl, blobUrl] of imageCache.entries()) {
		if (blobUrl.startsWith('blob:')) {
			URL.revokeObjectURL(blobUrl);
		}
	}
	imageCache.clear();
	console.log('🧹 图片缓存已清理');
}